package controllers

import (
	"NewEdu/models"
	"NewEdu/utils"
	"encoding/json"
	"strconv"
	"time"

	beego "github.com/beego/beego/v2/server/web"
)

// TExamController 考试控制器
type TExamController struct {
	beego.Controller
}

// URLMapping ...
func (c *TExamController) URLMapping() {
	c.Mapping("Post", c.Post)
	c.Mapping("GetOne", c.GetOne)
	c.Mapping("GetAll", c.GetAll)
	c.Mapping("Put", c.Put)
	c.Mapping("Delete", c.Delete)
}

// Post ...
// @Title 创建考试
// @Description 创建新的考试记录
// @Param	Authorization	header	string	true	"认证令牌"
// @Param	body		body 	models.TExam	true		"考试内容"
// @Success 201 {int} models.TExam
// @Failure 403 请求体为空
// @router / [post]
func (c *TExamController) Post() {
	var v models.TExam
	// 先尝试直接解析JSON
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err != nil {
		// 如果直接解析失败，尝试预处理时间格式
		type ExamRequest struct {
			Id         int    `json:"Id"`
			Title      string `json:"Title"`
			Desc       string `json:"Desc"`
			Createtime string `json:"Createtime"`
			Enable     *int   `json:"Enable"`
			Questions  string `json:"Questions"`
			StartAt    string `json:"StartAt"`
			EndAt      string `json:"EndAt"`
		}

		var req ExamRequest
		if err2 := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err2 == nil {
			// 复制已知字段
			v.Id = req.Id
			v.Title = req.Title
			v.Desc = req.Desc
			v.Questions = req.Questions
			v.Enable = req.Enable
			v.StartAt = req.StartAt
			v.EndAt = req.EndAt
			// 处理Createtime字段
			if req.Createtime != "" {
				if createtime, err := time.Parse("2006-01-02T15:04:05", req.Createtime); err == nil {
					v.Createtime = createtime
				} else if createtime, err := time.Parse("2006-01-02T15:04", req.Createtime); err == nil {
					v.Createtime = createtime
				}
			}

		} else {
			c.Data["json"] = utils.Export(1001, "解析失败", err.Error())
			c.ServeJSON()
			return
		}
	}

	if v.Createtime.IsZero() {
		v.Createtime = time.Now()
	}
	if _, err := models.AddTExam(&v); err == nil {
		c.Ctx.Output.SetStatus(201)
		c.Data["json"] = utils.Export(1000, "添加成功", &v)
	} else {
		c.Data["json"] = utils.Export(1001, "添加失败", err.Error())
	}
	c.ServeJSON()
}

// GetOne ...
// @Title 获取单个考试
// @Description 根据ID获取考试信息
// @Param	Authorization	header	string	true	"认证令牌"
// @Param	id		path 	string	true		"考试ID"
// @Success 200 {object} models.TExam
// @Failure 403 ID为空
// @router /:id [get]
func (c *TExamController) GetOne() {
	idStr := c.Ctx.Input.Param(":id")
	id, _ := strconv.Atoi(idStr)
	v, err := models.GetTExamById(id)
	if err != nil {
		c.Data["json"] = utils.Export(1001, "查询失败", err.Error())
		c.ServeJSON()
		return
	}

	// 解析StartAt时间字符串
	startAt, err := time.ParseInLocation("2006-01-02 15:04:05", v.StartAt, time.Local)
	if err != nil {
		startAt, _ = time.ParseInLocation("2006-01-02T15:04", v.StartAt, time.Local)

	}

	// 解析EndAt时间字符串
	endAt, err := time.ParseInLocation("2006-01-02 15:04:05", v.EndAt, time.Local)
	if err != nil {
		endAt, _ = time.ParseInLocation("2006-01-02T15:04", v.EndAt, time.Local)

	}
	// 如果考试还没开始，则不显示试题内容
	if time.Now().Before(startAt) {
		v.Questions = ""
		c.Data["json"] = utils.Export(1000, "查询成功", &v)
		c.ServeJSON()
		return
	}

	// 如果考试已经结束，则不显示试题内容
	if time.Now().After(endAt) {
		v.Questions = ""
		c.Data["json"] = utils.Export(1000, "查询成功", &v)
		c.ServeJSON()
		return
	}

	c.Data["json"] = utils.Export(1000, "查询成功", &v)
	c.ServeJSON()
}

// GetAll ...
// @Title 获取所有考试
// @Description 获取考试列表
// @Param	Authorization	header	string	true	"认证令牌"
// @Param	query	query	string	false	"过滤条件。例如: col1:v1,col2:v2 ..."
// @Param	fields	query	string	false	"返回字段。例如: col1,col2 ..."
// @Param	sortby	query	string	false	"排序字段。例如: col1,col2 ..."
// @Param	order	query	string	false	"排序方式，对应排序字段。例如: desc,asc ..."
// @Param	limit	query	string	false	"限制返回记录数，必须是整数"
// @Param	offset	query	string	false	"起始位置，必须是整数"
// @Success 200 {object} models.TExam
// @Failure 403
// @router / [get]
func (c *TExamController) GetAll() {
	// 获取所有考试
	exams, err := models.GetAllTExam()
	if err != nil {
		c.Data["json"] = utils.Export(1001, "查询失败", err.Error())
	} else {
		c.Data["json"] = utils.Export(1000, "查询成功", exams)
	}
	c.ServeJSON()
}

// Put ...
// @Title 更新考试
// @Description 根据ID更新考试信息
// @Param	Authorization	header	string	true	"认证令牌"
// @Param	id		path 	string	true		"要更新的考试ID"
// @Param	body		body 	models.TExam	true		"考试内容"
// @Success 200 {object} models.TExam
// @Failure 403 ID不是整数
// @router /:id [put]
func (c *TExamController) Put() {
	idStr := c.Ctx.Input.Param(":id")
	id, _ := strconv.Atoi(idStr)
	v := models.TExam{Id: id}
	if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err != nil {
		// 如果直接解析失败，尝试预处理时间格式
		type ExamRequest struct {
			Id         int    `json:"Id"`
			Title      string `json:"Title"`
			Desc       string `json:"Desc"`
			Createtime string `json:"Createtime"`
			Enable     *int   `json:"Enable"`
			Questions  string `json:"Questions"`
			StartAt    string `json:"StartAt"`
			EndAt      string `json:"EndAt"`
		}

		var req ExamRequest
		if err2 := json.Unmarshal(c.Ctx.Input.RequestBody, &req); err2 == nil {
			// 复制已知字段
			v.Id = req.Id
			v.Title = req.Title
			v.Desc = req.Desc
			v.Questions = req.Questions
			v.Enable = req.Enable

			// 处理Createtime字段
			if req.Createtime != "" {
				if createtime, err := time.Parse("2006-01-02T15:04:05", req.Createtime); err == nil {
					v.Createtime = createtime
				} else if createtime, err := time.Parse("2006-01-02T15:04", req.Createtime); err == nil {
					v.Createtime = createtime
				}
			}

			v.StartAt = req.StartAt
			v.EndAt = req.EndAt

		} else {
			c.Data["json"] = utils.Export(1001, "解析失败", err.Error())
			c.ServeJSON()
			return
		}
	}
	if err := models.UpdateTExamById(&v); err == nil {
		c.Data["json"] = utils.Export(1000, "更新成功", &v)
	} else {
		c.Data["json"] = utils.Export(1001, "更新失败", err.Error())
	}
	c.ServeJSON()
}

// Delete ...
// @Title 删除考试
// @Description 根据ID删除考试
// @Param	Authorization	header	string	true	"认证令牌"
// @Param	id		path 	string	true		"要删除的考试ID"
// @Success 200 {string} 删除成功
// @Failure 403 ID为空
// @router /:id [delete]
func (c *TExamController) Delete() {
	idStr := c.Ctx.Input.Param(":id")
	id, _ := strconv.Atoi(idStr)
	if err := models.DeleteTExam(id); err == nil {
		c.Data["json"] = utils.Export(1000, "删除成功", id)
	} else {
		c.Data["json"] = utils.Export(1001, "删除失败", err.Error())
	}
	c.ServeJSON()
}
